/*
 * java.lang.reflect.proxy类:提供了为对象产生代理对象的方法
 * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
 * 参数一:指定代理对象的类加载器,去加载生成的代理类
 * 参数二:指定接口，这些接口用于指定生成的代理长什么，也就是有哪些方法
 * 参数三:用来指定生成的代理对象要干什么
 * */


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*
* 类的作用:
*       创建一个代理
* */
public class ProxyUtil {

    /*
    * 方法的作用:
    *       给一个明星的对象，创建一个代理
    * 行参:
    *       被代理的明星对象
    * 返回值：
    *       给明星创建的代理
    *
    *
    * 需求：
    *       外面的人想要大明星唱一首歌
    * */
    public static Star createProxy(BigStar bigStar){
        Star star = (Star)Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(), //指定代理对象的类加载器
                new Class[]{Star.class}, //指定接口
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        /*
                        * 参数一：代理的对象
                        * 参数二：要运行的方法
                        * 参数三：调用方法时，传递的实参
                        * */
                        if("sing".equals(method.getName()))
                        {
                            System.out.println("准备话筒,收钱");
                        }else if("dance".equals(method.getName()))
                        {
                            System.out.println("准备场地,收钱");
                        }
                        return method.invoke(bigStar,args);
                    }
                } //用来指定生成的代理对象要干什么

        );
        return star;
    }
}


















